Temporary object handling system and method in an object based computer operating system

ABSTRACT

An object based operating system for a multitasking computer system provides objects which represent the architecture or interrelationships of the system&#39;s resources. Access to certain objects is required in order to use corresponding resources in the system. All objects have a consistent data structure, and a consistent method of defining the operations which apply to each type of object. As a result, it is relatively easy to add new types of system objects to the operating system. The object based operating system supports multiple levels of visibility, allowing objects to be operated on only by processes with the object&#39;s range of visibility. This allows objects to be made private to a process, shared by all processes within a job, or visible to all processes within the system. An object or an entire set of objects can be moved to a higher visibility level when objects need to be shared. In addition, access to each object is controlled through an access control list which specifies the processes authorized to access the object, and the types of access that are allowed. An object with a restricted access control list can be associated with a &#34;privileged operation&#34;, thereby restricting use of the privileged operation to those user processes authorized to access the corresponding object. Waitable objects are used to synchronize the operation of one or more processes with one another or with specified events. The system provides routines for generating new types of waitable objects without modifying the operating system&#39;s kernel.

The present invention relates generally to multitasking digital computersystems and particularly to methods and systems for managing the datastructures used by a multitasking digital computer system.

BACKGROUND OF THE INVENTION

Large computer systems generally allow many users to simultaneously usea single computer's resources. Such systems are herein calledmultitasking digital computer systems. Such computers include virtuallyall mainframe computers and most minicomputers.

One of the primary jobs of the operating system for a multitaskingcomputer system is to support and keep track of the operations of amultiplicity of users who are running numerous concurrent processes.Thus the computer's operating system must have data structures whichrepresent the status of each user. Such status information includes thememory and other resources being used by each user process.

If every user process were completely independent, had its own dedicatedresources, and there were no concerns about which resources each processcould use, operating systems could be relatively simple. However, inactuality, computer resources are shared and many user processes need toaccess commonly used or owned resources. In fact, each user may generatea number of execution threads which run simultaneously and which need tobe able to share resources and to communicate with other ones of theuser's threads.

Another concern in multitasking computer systems is security and dataintegrity. Ideally, the computer system should provide an accesssecurity system which enables each user to control the extent or amountof sharing of information that belongs to the user. Further, the systemshould provide several types of protection. For example, when multipleprocesses are allowed access to a resource, the identity of each processwhich attempts to access the resource should be tested to determine ifthat particular process is authorized to access the resource. The systemof access control should also provide limited "visibility" of computerresources so that an unauthorized user cannot obtain information aboutanother user by repeated attempts to access resources with variousnames. In addition, to protect data integrity, the system must protectagainst simultaneous accesses by different authorized processes.

Yet another concern of multitasking operating systems is clearing thesystem of "objects" (i.e., files and data structures) which are nolonger needed by any of the systems users. Ideally, the system shouldalso be able to automatically deallocate resources, such as input/outputdevices, no longer needed by a process.

SUMMARY OF THE INVENTION

In summary, the present invention is an object based operating systemfor a multitasking computer system. The present invention, which is alsocalled an object based architecture, is "object based" because itprovides objects which represent the architecture or interrelationshipsof the system's resources. The present invention provides an extensible,yet rigorous framework for the definition and manipulation of objectdata structures.

Objects, generally, are data structures which store information aboutthe user processes running in the system, and which act as gateways tousing the system's resources. Resources, generally, include sets ofinformation, physical devices such as a tape drive, and various programsor "operations". Such resources are not available to a user unless theuser has explicit permission to use that resource. More specifically,access to certain objects is required in order to use the correspondingresources of the computer system.

All system objects have a consistent data structure, and a consistentmethod of defining the operations which apply to each type of object. Asa result, it is relatively easy to add a new type of system object tothe operating system, or to change an existing system object.

Another feature of the present invention is a multifaceted accesscontrol system. The object based operating system of the presentinvention supports multiple levels of visibility, allowing objects to beoperated on only by processes with the object's range of visibility.This allows objects to be made private to a process, shared by allprocesses within a job, or visible to all processes within the system.

In addition to visibility control, access to each object is controlledthrough an access control list which specifies the processes authorizedto access the object, and the types of access that are allowed. Anobject with a restricted access control list can be associated with a"privileged operation", thereby restricting use of the privilegedoperation to those user processes authorized to access the correspondingobject. An object can furthermore be allocated to a specified job orprocess to protect the object from use by others, thereby denying accessby otherwise authorized processes.

Yet another feature of the present invention concerns "waitableobjects", which are objects used to synchronize the operation of one ormore processes with one another or with specified events. The presentinvention provides routines for generating new types of waitable objectswithout modifying the operating system's kernel. More particularly, aset of several different types of predefined kernel synchronizationprimitives can be embedded in user defined objects, thereby enablingordinary programmers and system users to define and generate waitableobjects.

BRIEF DESCRIPTION OF THE DRAWINGS

Additional objects and features of the invention will be more readilyapparent from the following detailed description and appended claimswhen taken in conjunction with the drawings, in which:

FIG. 1 is a block diagram of a computer with a multitasking operatingsystem.

FIG. 2 is a block diagram of the virtual memory spaces of severalconcurrently running user processes.

FIG. 3 is a block diagram showing how data structure objects in thesystem are organized in a three level hierarchy.

FIG. 4 is a block diagram showing the hierarchical relationship betweena user object, a job, the processes for a job, and the execution threadsfor a process.

FIG. 5 is a block diagram showing the range of objects visible to aparticular execution thread.

FIG. 6 is a block diagram of the container directory and objectcontainer data structures at one level of the three level hierarchyshown in FIG. 3. FIG. 6A is a more detailed diagram of the process levelcontainer directory for a process.

FIG. 7 is a block diagram of an object ID.

FIG. 8 is a block diagram of the data structure of an object.

FIG. 9 is a block diagram an object type descriptor.

FIG. 10 is a block diagram of the process for adding a new object typeto the system by creating an object type descriptor for the new objecttype.

FIG. 11 is a block diagram showing the reference pointers for aspecified object.

FIG. 12 is a flow chart of the process for creating a reference ID for aspecified object.

FIG. 13 is a flow chart of the process for deleting an object ID.

FIG. 14 is a flow chart of the process for transferring an object fromone object container to another object container.

FIG. 15 is a flow chart of the process for transferring an objectcontainer to a specified container directory.

FIG. 16 is a flow chart of the process for conditionally creating aspecified object.

FIG. 17 is a block diagram of the access control list for an object anda execution thread which is attempting to access the object.

FIG. 18 is a block diagram of the data structures for privilegedoperation objects.

FIG. 19 is a block diagram of the data structures for allocating a setof objects to a thread, process, job or user.

FIG. 20 is a block diagram of the data structures for implementing userdefined waitable objects.

DESCRIPTION OF THE PREFERRED EMBODIMENT

Referring to FIG. 1, a computer system 100 in accordance with thepresent invention includes a high speed central processing unit (CPU)102 which concurrently runs several processes 104-110. The CPU 102 maybe either a single powerful processor or may contain multipleprocessors. As is standard in multitasking computer systems, eachprocess has its own virtual memory space which is mapped partially intohigh speed primary memory 112 and partially into lower speed secondarymemory 114 by a virtual memory manager 116. More generally, each process104-110 is allocated a certain portion of computer's resources,including selected peripheral devices such as terminals 120-122 andother input/output devices 124 and 126. Other types of resources whichare allocated to selected ones of the processes include specified setsof data and data structures in the system's memory 112-114.

The set of software which controls the computer's operation and theallocation of resources to the processes 104-110 running the computer iscalled the operating system 130. For the purposes of the presentdiscussion it can be assumed that the operating system 130 is residentin primary memory 112, although certain infrequently used portions ofthe operating system may be swapped out to secondary memory by thememory manager 116.

One feature of the present invention is that the computer system 100 canserve as a "computer server" to one or more client computers 132. Clientcomputers 132, coupled to the CPU 102 by a bus interface 134, can sendtasks to the computer system 100 for execution. The computer system 100is a mainframe or other high performance computer system which canexecute tasks in a relatively short period of time compared to theclient computers 132. The operating system 130 of the present inventionincludes a mechanism for setting up a process in the computer system 100which adopts the "profile" or characteristics of the process in theclient computer which is being served.

Referring to FIG. 2, there is shown a block diagram of the virtualmemory spaces of several concurrently running user processes 104-108.The virtual memory space of every process includes a portion 140 whichcan be accessed by "user mode" programs as well as "kernel mode"programs, and a portion 142-144 which can be accessed only by "kernelmode" programs. The kernel mode portion 142-144 includes two sets ofsoftware called "the kernel" 142 and "the executive" 144.

As shown in FIG. 2, the portion of the virtual memory space whichcomprises the kernel mode portion 142-144 is common to all userprocesses running in the computer system. In other words, a predefinedportion of the address space of every user process is occupied by theoperating system 130 and its data structures. The user mode portion ofeach user process 140 occupies a distinct virtual memory space.

"Kernel mode" is a mode of operation used only by kernel and executivesoftware routines. Only kernel mode routines can access the datastructures used to control the operation of the computer system and todefine the system resources allocated to each user process.

When a user mode program 145 in a user process 104 creates an object, orperforms any one of a number of operations on an object, the userprocess calls a kernel mode routine 146 in the kernel mode portion142-144 of its address space to perform the necessary operations. Whenthe kernel mode routine 146 completes the necessary operations on thekernel mode data structures, it returns control to the user mode program145.

The kernel 142 is the "lowest layer" of the operating system 130 whichinteracts most directly with the computer's hardware 148. The kernel 142synchronizes various activities, implements multiprocessingcapabilities, dispatches execution threads, and provides services todevice drivers for handling interrupts.

The executive 144, which also runs in kernel mode, implements systemservices, memory management, user-level object support, the computer'sfile system, network access, and device drivers. The executive defines"system policy", such as the rules which govern the visibility of useraccessible objects.

Object Architecture

The object architecture of the present invention is a set of datastructures and procedures which controls the use of user definableobjects

GLOSSARY

To clarify the following discussion, the following definitions areprovided.

"Objects" are data structures used to hold information that is used bythe operating system and which must be protected from unauthorizedaccess by users of the system. While users cannot themselves "define"objects, they can ask the operating system to create specified objectson their behalf. The resultant objects are system data structures thatare accessible by the user through system routines which protect theintegrity of those objects. For instance, a "process object" is a typeof object used in the present invention to store the information neededby the operating system to keep track of the status of a particular userprocess. "User accessible objects" are objects used by user processes,and will be referred to herein simply as "objects."

"Kernel objects" are a distinct set of data abstractions used by thesystem's kernel and are called kernel objects in order to distinguishthem from the regular objects which are part of the object architectureof the present invention.

A "user" is herein defined to mean a person or other entity recognizedby the computer system as being authorized to create processes and touse resources in the computer system.

A "job" represents the current set of system resources being used by aparticular user.

A "process" is the entity to which a virtual memory address space isassigned, and is the entity to which process-level objects are assignedThere can be multiple processes in a job. Whenever a job is created, a"top level" process is created for that job. Any process, including thetop level process, can cause the creation of additional processes,called subprocesses or child processes. Any process which createsanother process is referred to as a parent process.

A "thread", also called an "execution thread" , is the entity whichactually executes programs and thus provides a stream of execution(sometimes called a context state). It is the schedulable entity whichexecutes program steps and consumes resources. More technically, athread is a system defined object that executes a program that isresident in a process's address space. A thread contains a machine statethat consists of the computer's register contents, a program counter,and other privileged information needed to cause the thread to execute aprogram. Each process may create a number of execution threads which run"simultaneously" and which can share resources and communicate with oneanother. Multiple threads can run simultaneously when multiple CPUs areavailable. On a single CPU system the operating system makes the threadsappear to run simultaneously. All resource limitation data structuresfor a thread belong to the thread's process.

An "object container" is a data structure for storing pointers toobjects. It is essentially a table which is used to keep track of a setof objects.

A "container directory" is a data structure for storing pointers to aset of object containers. Thus a container directory is a table used tokeep track of a set of object containers.

OBJECT HIERARCHY

Referring to FIG. 3, the object architecture of the present inventionprovides a hierarchical "visibility structure" for objects. When anobject is "visible" to a particular execution thread or process it meansthat the execution thread may at least attempt to access that object.Objects not visible to a process are stored in such a way that theprocess cannot even attempt access.

When an object is created, it is placed at one of three levels: thesystem level 160, the job level 162, or the process level 164. At thesystem level 160 there is a single container directory 170 whichcontains a set of system level object containers 172, 174, 176. Objects178-180 in system level containers are visible to all threads on thesystem.

At the job level 162 there is a container directory 190 for every jobthat is currently active in the system. Each job level containerdirectory 190 contains a set of job level object containers 192, 194,196. Objects at the job level 162 are visible only to threads in thatjob.

At the process level 164 there is a container directory 200-206 forevery process that is currently active in the system. Each process levelcontainer directory 200 contains a set of process level objectcontainers 212, 214, 216. Objects at the process level 164 are visibleonly to threads in that process. For example, a thread cannot access anobject that is at the process level for another process. As will beexplained below., this visibility restriction is achieved by giving eachprocess a pointer, called an object ID, only to its own process levelcontainer directory. Because a process cannot have a pointer to theprocess level container directory for other processes, each process isincapable of "expressing" the object ID of objects in the containers notvisible to that process.

Each process is assigned at least two process level object containers212 and 214. The first object container 212 is called the public displaycontainer for the process and the second container 214 is called theprivate container. Only objects that the process wants to be accessibleto subprocesses are placed in the public display container 214, and allother objects created by the process are put in its private container216.

Referring to FIG. 4, there is a hierarchy of objects which representsusers, jobs, processes and threads. FIG. 4 shows the hierarchicalrelationship between the objects for a user, a job, the processes for ajob, and the execution threads for a process.

As shown, there are four levels of objects in theUser-Job-Process-Thread (UJPT) hierarchy, and each type of object isstored in a corresponding system level object container 220, 222, 224and 226. All user objects 230 are stored in a user object container 220.Job objects 232 are stored in a job object container 222. Processobjects 234 and 236 are stored in a process object container 224, andthread objects 240, 242 and 244 are stored in a thread object container226.

The four levels of objects provide a logical grouping of functionalityand control. A user object 230, which appears at the highest level ofthe User-Job-Process-Thread (UJPT) hierarchy, defines the securityprofile and resource quotas/limits for its underlying objects. The userobject 230 also stores a pointer to the job object 232 for the user.

A job object 232 provides a job level container directory and a set ofresource limits for a collection of processes running as a job. The jobobject 232 includes a reference pointer to its user object 230, and alist head which points to the first process object 234 for the job. Thusthe process objects 234-236 for a particular job are accessed as alinked list. Note that in FIG. 4, linked list pointers are depicted asnarrow lines with arrow heads which point either down or to the rightwithin the hierarchy, while reference pointers are depicted as thickerlines with arrow heads that point upwards in the hierarchy.

A process object 234 provides a process level container directory, apointer to the page table for the process, and pointers to theparameters needed to manage the address spaces of its execution threads.The process object 234 includes a reference pointer to its job object232, and a list head which points to first thread object 240 for theprocess. The thread objects 240-242 for a particular process areaccessed as a linked list. The process object 234 also contains a listhead which points to the first subprocess for which the object 234 isthe parent process (not shown in FIG. 4).

A thread object 240 contains a thread control block which stores theprocessor state as it executes the steps of a program, including thepointers and values needed to keep track of all resources used by thethread object. The thread object 240 includes a reference pointer to itsprocess object 234, and a list pointer for joining additional threadobjects into a linked list of threads for the process.

FIG. 5 is a block diagram showing the range of objects visible to aparticular execution thread. In particular, each thread object containsa thread control block 250 which points to the software process controlblock 252 for the thread's process. The software process control block252 contains pointers which indirectly point to a container directory ateach of three visibility levels The container directory 170 at theprocess level is the container directory belonging to the process objectfor the thread. Similarly, the container directory 190 at the job levelis the container directory belonging to the job object for the thread.The system level container directory 200 is the same for all threads.

MUTEXES

Access to each and every container directory is governed by acorresponding mutex. A mutex is essentially a flag used to synchronizeaccess to a corresponding system resource. The purpose of a mutex is toensure that only one thread accesses a particular resource at any onetime. To use a resource that is protected by a mutex, one must first"obtain the mutex". Obtaining a mutex is an atomic (i.e.,uninterruptable and interlocked) operation in which the mutex is tested.If the mutex was previously set, the process trying to obtain the mutexis suspended until the mutex becomes free. If the mutex is free, it isset and the requesting process is then allowed to access the protectedresource.

Mutexes are used throughout the present invention to synchronize accessto container directories, object containers, linked lists of objects,and many other types of data structures. For instance, to change certainfields of an object, the thread making the change must first obtain themutex for the container in which the object is located. In addition,many objects contain a mutex which protects that object.

All mutexes used by the system are stored in an array 254 in anon-paged, protected portion of primary memory, accessible only tokernel mode routines, which cannot be swapped out by the memory manager.The "mutexes" shown in many of the data structures in the Figures areactually pointers to the corresponding mutexes in the mutex array 254.In other embodiments the mutexes need not be stored in an array so longas they are stored in non-paged, protected memory.

As will be explained in more detail below, in the section entitledWaitable Objects, mutexes are a special type of kernel synchronizationprimitive. As shown in FIG. 5, there is a mutex for each of the threecontainer directories which are visible to a particular thread.

CONTAINER DATA STRUCTURES

Referring to FIG. 6, there is shown a portion of the data structures forone container directory 260 and one object container 262. For thepurposes of this discussion, the container directory and objectcontainer data structures may be at any level of the three levelhierarchy shown in FIG. 3.

The data structures for container directories and object containers arevirtually identical. For the sake of clarity, the data structure for anobject container will be explained first.

An object container 262 comprises a container object 270, which containsa standard header 272, a pointer 274 to a name table 275, and a pointer276 to an object array 280. The purpose of the name table 275 is totranslate object names into object IDs, and the purpose of the objectarray 280 is to translate object IDs into pointers to objects 281. Theobject container also includes a container mutex 278 which is used tosynchronize access to certain fields in the name table 275, the objectarray 280, and the objects in the container.

The name table 275 has two portions, an object name array 282 and anarray of name definition blocks 284. The object name array 282 is simplyan index into the array 284 of name definition blocks and may beimplemented as either a hash table or a binary tree. In either case,each entry in the name array 282 contains one object name and onepointer to an entry in the array of name definition blocks 284. Eachname definition block 286 contains information for one object name,including the object ID as well as the object's type (object types aredescribed in more detail below) and mode (i.e., accessible by user modeor kernel mode routines).

The object array 280 contains an array size value 288 which denotes thesize of the array 280, which corresponds to the maximum number of objectpoints that can be stored in the object array 280. The object array hasa set of elements 290-294, each of which can store either an objectpointer or a place holder for an object pointer. The count value field296 denotes the number of elements in the object array which currentlyhold object pointers (i.e., the count value is equal to the number ofobject pointers currently stored in the object array 280).

Array elements such as element 292 which store a place holder are saidto be "free". These unused elements are arranged in a singly linked"free list", the head of which is the "next free" link head field 298.The unused elements 292 in the object array contain a "sequence numberhigh" field and a link to the next free element in the object array. Thelink fields in the unused elements form a list of unused object arrayelements. As will be described below with respect to FIGS. 7 and 8, the"sequence number high" value is used when an object pointer is stored inthis element. See the discussion of the sequence number high field 340of an object ID, below.

Whenever a new object pointer is stored in the object array 280, theelement at the top of the free list (pointed to by the link head 298) ispopped off the top of the free list and is used to store the new objectpointer. The count field 296 is also incremented. When an object pointeris deleted, it is added to the top of the free list and the count field296 is decremented.

The header of every object, including a object container object 270,contains a back pointer to the container in which it resides. Thecontainer which holds an object container is a container directory 260,and therefore the object container's back pointer 299 points to itscontainer directory 260. The back pointer in the object header of acontainer directory object (not shown) points to itself.

A container directory 260 comprises a container directory object 300,which has the same basic data structure as an object container 262.However, the object names in the name table 306 of a container directory260 are the names of object containers. In other words, the objectsreferenced by the name table 306 and the object array 310 in a containerdirectory are object containers, whereas many different types of objectscan be referenced by the name table 275 and object array 280 of anobject container 262. Note that every object, including containerdirectories, must have at least one object ID and one correspondingpointer in a container. Since there is no "container for containerdirectories", the first entry in the object array 310 of an objectcontainer is a pointer to itself.

The container directory object 300 contains an additional pointer calledthe display index 312. For system and job level container directories,the display index simply points at the first item in the object array310.

For process level containers, the top entries in the object array pointto the publicly accessible object containers visible to the process,herein called display containers, and the next entry points to theprivate container for the process. As mentioned above with reference toFIG. 3, each process is assigned at least two process level objectcontainers 212 and 214. The first object container 212 is called thepublic display container for the process and the second container 214 iscalled the private container. Only objects that the process wants to beaccessible to subprocesses are placed in the public display container212, and all other objects created by the process are put in its privatecontainer 214 or other private object containers.

Referring to FIG. 6A, there is shown a more detailed diagram of theprocess level container directory 260 for a process. Whenever asubprocess is created, it is automatically given a pointer 314 to itsparent's public display container as well as a pointer 316 to its ownpublic display container and a pointer 318 to its private displaycontainer. As shown in FIG. 6A, the display index 312 points to theentry 316 in the object array which points to the public displaycontainer for this process. If this process is a subprocess, above thepublic display entry 316 are pointers 314 and 320 which point to thedisplay containers for this process's parent process and grandparentprocess, and so on. Below the entry 318 for the process's privatecontainer, the container directory 660 may contain pointers 322 to otherprocess level private containers for this process.

OBJECT DATA STRUCTURE

Referring to FIG. 7, when an object is created, it is assigned a 64-bitvalue called its object ID 330. This value provides the fastest meansfor a user-mode routine to identify and access the object Only kernelmode routines can use pointers which directly address an object.

When an object is created, the "object ID" returned by the objectcreating routine is called the principal ID. Every object has only oneprincipal ID. An object may also have one or more reference IDs whichalso point indirectly to the object. Reference IDs are discussed belowin the section entitled Reference IDs.

Both the principal ID and reference IDs are herein called "object IDs".In addition, it should be noted that these IDs are not "capabilities" asthat term is used when describing capability based operatingsystems--rather they are indirect pointers to data structures calledobjects.

The principal ID of an object that is accessible by two processes is thesame in both processes. This extends to objects at all levels. Thisproperty allows IDs of shared objects to be communicated betweencooperating threads.

Object IDs are used to uniquely identify objects within the system. Itshould be noted that an object ID is not the address of an object; it isa value which may be translated into the address of an object throughthe use of the object array in an object container as shown in FIG. 6.Thus object IDs only indirectly point to objects.

Referring to FIGS. 6 and 7, the fields of an object ID 330 are asfollows. An index into a container directory 332 is used to index intothe object array 310 of a container directory 260 and thereby find apointer to the object container 262. An index into a container's objectarray 334 is used to index into the object array 280 of an objectcontainer and thereby find a pointer to the object.

The level 336 of the principal object ID determines the level of anobject's visibility: process, job or system, as was discussed withreference to FIG. 3. To find the container directory for an object ID,one may refer to the software process control block 252 (see FIG. 5).Any process which can express the object ID for an object can try toaccess the object. As shown in FIG. 5, the software control block 252contains a pointer to the container directory corresponding to eachlevel of visibility.

The sequence number low 338 and sequence number high 340 are used toprevent a program from using an object ID after the corresponding objecthas been deleted, and other types of programming errors. The sequencenumber low field 338 is a ten bit value which receives a new randomlygenerated value each time that a new object is created. The sequencenumber high field 340 is a ten bit value inside each object ID that isincremented each time that an object is created, and reset to zero whenit overflows.

Note that the elements 290-294 in the object container are reused afteran object is deleted. When an object pointer is deleted from the objectarray 280 in a container, the sequence number high 340 for thecorresponding object ID is stored in the element that formerly held thedeleted object pointer. The value of the sequence number high isincremented and stored in an object ID (and in the header of an object,as will be explained below) the next time that this element of theobject array is used to store a pointer to a newly created object.

The use of sequence numbers does not totally eliminate the problem ofillegal references to deleted objects, it just reduces it to anextremely small probability for most programming situations.

Referring to FIG. 8, each object 350 in the preferred embodiment has twoparts, a standard object header 355 which is only manipulated by kernelmode object architecture routines, and an object type specific body 360which is manipulated by object specific service routines.

The object header 350 of each object is a data structure that has anumber of fields 362-396. The object type 362 identifies the type of theobject. The PTR-Object Type Descriptor field 368 contains a pointer toan object type descriptor (OTD) for this particular object type. OTDswill be discussed below with reference to FIG. 9.

In a typical implementation of the present invention there will be atleast twenty-five different types of objects, including containerdirectories, object containers, user definition objects, job definitionobjects, process control blocks, thread control blocks, and many others.For each object type there is an object type descriptor 400, describedbelow with reference to FIG. 9, which specifies the routines forhandling, allocating and deleting objects of that type. When an objectID is translated into a pointer to an object header, the type field 362in the object header is compared with the desired object type to makesure that the proper object is being accessed.

For all objects except container objects, the object ID count 366represents the number of object IDs which refer to the object. Forcontainer objects, the object ID count 366 represents the number ofcontainer directory object array pointers which refer to the object,which is also the number of container directories that can refer to thisobject container. Note that for container objects the object ID itselfis not counted. Hence, for object containers, the object ID count 366 isequal to one unless the container is a display container for a parentprocess (see FIG. 6A and the corresponding discussion, above).

The object ID count 366 signifies the number of reasons that an objectshould not be removed from the system. If the object ID count 366 iszero, then no object container has a pointer to that object's header355.

The object ID count field 336 is never directly incremented ordecremented by a user mode routine, only the executive routines forobject support operate on this field 366. For a kernel mode routine toincrement or decrement this field 366, the mutex field 278 (in FIG. 6)of the object container in which this object resides and directory-levelmutex must first be acquired. This is necessary to ensure that an objectcannot be deleted while another reference to the object is beingestablished. As will be explained below, it is sometimes necessary toacquire several mutexes before performing an operation on an object toensure the integrity the object.

Whenever an access to an object will span a period of time that can notbe protected by use of mutex locks on appropriate data structures, thepointer count field 364 must be incremented. In particular, an addressof an object may not be used to regain access to the object unless thepointer count 364 has been previously incremented.

The pointer count 364 represents the number of pointers that have beentaken out on the object, plus one for a non-zero object ID count. Whenan object ID is translated by an object service routine, the pointercount 364 is incremented by one. The pointer count 364 for an objectsignifies the number of reasons the storage for an object should not bedeallocated. To increment this field, the directory-level mutex mustfirst be held. This is necessary to avoid race conditions with theobject ID being deleted.

When an object ID, object container pointer, or reference object ID isdeleted, the object ID count 366 of the object is decremented. If theresultant object ID count is zero, the pointer count 364 is decremented,and then the process of deleting the object is begun by calling anobject type-specific remove routine to initiate any required objecttype-specific removal actions, such as canceling I/O.

As mentioned above, when the object ID count 366 is decremented to zero,this causes the pointer count 364 to be decremented, as does thedereferencing of a pointer. When the pointer count 364 reaches zero, theobject type-specific delete routine is called, and the object's storageis deallocated (i.e., the object is deleted).

One of the major goals of the lock strategy for objects is to allow thepointer count 364 to be decremented without having to hold a lock (i.e.,mutex) to do so. This allows low overhead dereferencing of objects onsuch operations as I/O, wait, and the deleting of a reference object.Note that the pointer count 364 should be non-zero whenever the objectID count 366 is non-zero.

The link field 370 contains a forward pointer to the next object headerof this type, as well as a backward link to the previous object headerof this type. Thus all objects of each type are linked into a doublylinked list. The list head resides in the OTD for the object type, aswill be shown in FIG. 9.

The container pointer 372 is a pointer to the object container in whichthe object resides. This field, also called the object's back pointer,is dynamic in that the object may be transferred to a different objectcontainer Such a transfer would result in the assignment of a new objectID to the object. This field is zeroed when the principal object ID isdeleted. This field 372 may be accessed only by a thread holding boththe directory-level mutex and the mutex 278 (shown in FIG. 6) within theobject container.

The index into container field 374 is the index into the object array inthe container for this object.

The level field 376 specifies the level of visibility of the object, andthe level of the object container in which the object resides

When an object ID is translated into the address of an object, the valueof the object ID's sequence fields 338 and 340 (see FIG. 7) are comparedto the values of the sequence fields 378 and 380 in the object header.If they are not identical, then the object ID in invalid (i.e., theobject referenced by the object ID has been deleted and thecorresponding object ID entry in the object container has been reused).

The sequence number fields 378 and 380 of an object may be accessed onlyby a process which holds both the directory-level mutex and the mutexwithin the object container.

Note that it is possible to construct the principal object ID for anobject if one is given the object header. The level field 376 is equalto the level field 336 in the object's principal ID, and the sequencenumber fields 378-380 are equal to those in all of the object's ID. Thecontainer index field 374 of the object header is equal to the containerindex field 334 of the object's principal ID.

Finally, the container directory index field 332 of the object ID isconstructed as follows The container pointer field 372 points to theobject header of a container. The index field 374 in that container'sobject header is equal to the directory index 332 for the principalobject ID.

A dispatcher pointer 381 in the object header is given a nil value ifthe object is not a waitable object, as will be explained in more detailin the section entitled Waitable Objects. If the object is a waitableobject, the dispatcher pointer 381 points to a data structure for a"kernel synchronization primitive" that is stored in the object body360.

The pointer 382 to a name definition block is used to associate a namestring with an object. If the object has an associated name, this field382 contains a pointer to a name definition block which contains thename. Otherwise this field has a value of zero. The directory levelmutex, the object container mutex, and the type-specific mutex must allbe acquired in order to modify this field 382.

The owner's ID field 384 identifies the owner of the object. This fieldis used by the security access validation rules, which are discussedbelow in the section entitled Access Control Lists.

The ACL pointer field 386 points to an access control list (ACL) for theobject. A nil value indicates that no ACL exists for the object. Theformat and use of the ACL are discussed below in the section entitledAccess Control Lists.

The allocation block pointer 388 is a used by object ID translationroutines to ensure that the thread which is trying to access the objecthas access to the object. In order to translate an object ID into apointer to an object header, the requesting thread must have access tothe object as determined by the ACL, and must be in the allocation classof the object. Object allocation and allocation classes are discussedbelow in the section entitled Object Allocation.

The Allocation List Head Offset parameter 389 is non-negative when theobject 350 has other objects allocated to it. The Allocation List HeadOffset 389 indicates the position in the object body 360 of a list headwhich points to a list of allocation blocks for the objects allocated tothis object.

Several binary flags 390-396 govern use of the object. When thetemporary flag 390 is set it indicates that the object is temporary. Ifan object is temporary, the object is automatically deleted when allreference IDs to it are deleted. Note this is different from ordinaryobject deletion, which occurs when both the object ID count 366 and thepointer count 364 are equal to zero. Therefore, when the object ID countis decremented to one, the temporary flag field 390 must be checked.This will be explained in more detail in the section entitled ReferenceObject IDs and Temporary Objects.

The transfer flag 392, when clear, indicates that the object cannot betransferred to another container. The transfer action field state isdetermined at the time the object is created.

The reference inhibit flag 394, when true, prevents the creation ofreference IDs to this object.

The access mode flag 396 contains the owner mode (kernel or user) of theobject Kernel-mode objects may not be created in user owned containers.Mode is also used to verify access to the object by the accessvalidation procedures described below in the section entitled AccessControl Lists.

OBJECT TYPE DESCRIPTOR (OTD)

Referring to FIG. 9, there is a single object type descriptor (OTD) foreach object type defined by the system. OTDs are objects, and all OTDobjects reside in a single system level container.

OTD objects have a standard object header 402 and an object body whichcontains general information about an object type, not a particularinstance of an object. For example, on OTD indicates whether an objecttype supports synchronization or wait operations. Anything an OTDspecifies about an object type applies to all instances of that objecttype.

Part of the information in an OTD 400 is the location of a number ofroutines 430-438 that may be called by the executive 144 (see FIG. 2).These routines have standard definitions across all object types, butrequire object type-specific processing. The routines are located by theexecutive via standard offsets into the OTD, at which are locatedpointers 420-428 to these routines.

Users of object instances of a particular type do not need to knowanything about the routines 430-438 pointed to by the OTD. Only thedesigner of an object type must know how these routines work. Thus, thepresent invention makes it relatively easy to introduce new object typesinto a system because standard types of operations which depend on theparticular structure of a new object type, such as creating, allocatingand deleting the object, are defined by the designer of the object typeand thus the details of the object's structure do not concern the usersof these objects.

All the fields 404-428 of the OTD's body have a standardized definition.This allows the executive 144 to use the information in an OTD withouthaving any detailed knowledge of the corresponding object type.

The Object Type field 404 contains a value indicating the type of objectthe OTD represents.

The List Head field 406 is a list head for a doubly linked list 405 ofall the object instances of this type. The List Head field 406 containsa forward link to the first object header of this type, and a backwardlink to the last object header of this type. These links are used forconsistency checking within the object architecture.

The Count field 408 contains a count of the number of objects of thecorresponding type that currently exist in the system.

The Dispatcher Offset 410 is used only for object types which supportwait operations. When non-negative, the Dispatcher Offset 410 is theoffset from the start of the object body to a "kernel synchronizationprimitive" which is located inside the object body for object instancesof this type. The Dispatcher Offset 410 is used to compute a pointer tothe kernel synchronization primitive, called the Dispatcher Pointer,that is stored in each object's header. When a wait operation is to beperformed on an object instance of this type, the system's executive 144issues a kernel wait operation on the kernel synchronization primivitepointed to by the object's Dispatcher Pointer. Kernel synchronizationobjects are discussed in more detail below in the section entitledWaitable Objects.

Any object type which has a non-negative dispatcher field must allocatethe object instances of this type from non-paged portions of thesystem's primary memory because the kernel synchronization object mustbe in non-paged memory.

The Access Mask 412 is a bit mask which is used in conjunction withaccess control lists, and is discussed in section below entitled AccessControl Lists.

The Allocation List Head Offset 414 is used only for object types thatmay have objects allocated to it. For example, thread objects, processobjects, job objects and user objects can have other objects allocatedto them. When the Allocation List Head Offset 414 is non-negative, it isthe offset from the start of the object body to a list head which pointsto a set of allocation blocks. Object allocation and allocation blocksare discussed in more detail in the section entitled Object Allocation.

The Create Disable Flag 416, when set, prevents additional objects ofthis type from being created. It is used as part of process ©f shuttingthe system down in an orderly fashion.

The OTD Mutex 418 provides synchronization for creation, deletion andstate changes among objects of this type.

The Allocate field 420 points to an allocation procedure 430 whichperforms object type-specific procedures when an object of this type isallocated to a user or process. Object allocation is discussed below inthe section entitled Object Allocation. A null routine is provided foruse by object types which do not have an allocate procedure.

The Deallocate field 422 points to a deallocation procedure 432 whichperforms object type-specific procedures when an object of this type isdeallocated from a user or process

The Remove field 424 points to a remove procedure 434. The removeprocedure 434 for each object type performs any necessary actions thatmust be performed before deleting an object. The remove procedure iscalled when all object IDs to the object have been deleted. Thisprocedure 434 allows object type-specific processing to be performedafter applications can no longer reference the object instance, butbefore the object instance is actually deleted. A null procedure isprovided for use by object types which do not have a remove procedure.

The Delete field 426 points to a delete procedure 436, which isresponsible for manipulating object type-dependent data structures anddeallocating the storage allocated for the object's extensions. Thedelete procedure is called when an object's pointer count 364 isdecremented to zero. Note that the pointer counter 364 cannot decrementto zero when the object ID count is non-zero. After the delete procedure436 is run, an object deletion routine in the kernel deallocates thestorage for the object's header and body. A null procedure is providedfor use by object types which do not have a delete procedure.

The Shutdown field 428 points to a shutdown procedure 438. The shutdownprocedure 438 is called once when an object type is permanently removedfrom the system, generally at system shutdown time. The purpose of thisroutine is to perform object type-specific shutdown operations. Amongother things, this provides the opportunity to dump any statistics thatmay have been gathered relating to the object type.

Although not referenced in the OTD 400, there is a distinct objectcreation routine 440 for each object type, herein called CREATE₋₋ XXXXwhere XXXX identifies the object type. The create routine 440 createsnew instances of the object type, allocates space for the object bodyand its extensions, and also stores initial values and data structuresin the object body.

Table 1 is a list of some of the object types used in the preferredembodiment and which are discussed in this specification.

                  TABLE 1                                                         ______________________________________                                        OBJECT TYPES                                                                  ______________________________________                                        Container Directory                                                           Object Container                                                              User                                                                          Job                                                                           Process                                                                       Thread                                                                        Object Type Descriptor (OTD)                                                  Privileged Operation Object                                                   FPU - Function Processor Unit (device unit)                                   Notification Object  **Waitable Objects                                       Synchronization Object                                                        Semaphore Object                                                              Timer Object                                                                  ______________________________________                                    

CREATING NEW OBJECT TYPES

Except for a few object types used by the object architecture itself,such as object containers, all object types are defined within thesystem by calling a service routine to create an object type-specificObject Type Descriptor (OTD), the format of which is shown in FIG. 9.This service routine is called Create₋₋ OTD. The OTD for each objecttype contains information that allows the system to interact with objecttype-specific routines in a standard fashion.

It is a feature of the present invention that there is a simpleprocedure for defining new types of objects and a corresponding set ofobject type-specific routines for interacting with the system. Referringto FIG. 10, all OTDs are objects stored in a system level container 460called the OTD Container. When a new OTD 462 is created, it is added tothe list of defined OTDs - i.e., it is added to the OTDs in the OTDContainer 460 and is linked to the list of OTDs by the Link field 370(shown in FIG. 8) in the headers of the OTDs. This provides theframework for operating system-to-object type interactions. It alsoprovides a standardized location for keeping object type-specificcontrol information. For example, a count field 408 (shown in FIG. 9) ineach OTD contains a count of the instances of the related object type.

To create a new OTD 462, the caller must provide the following items. Aname 464 must be provided for the new object type, which is stored inthe name array of the OTD container 460. The caller must also provide aset of routines 466 for allocating, deallocating, removing, and deletingobjects of this object type, and for handling objects of this typeduring system shutdown. A non-negative allocation list head offset 468is provided if the new object type is to be an object type to whichother objects can be allocated. A non-negative dispatcher offset 470 isprovided if the new object type is to be a waitable object.

An access control list 472 may optionally be provided if use of the newobject type is to be restricted to a defined set of authorized users.Additionally, an access mask 474 must be provided to indicate the typesof allowed access to objects of this type.

A special routine 476 must be provided for creating objects of the newobject type. This routine is generally named Create₋₋ XXXX where "XXXX"is the name of the object type. The create object routine 476 usesinformation in the OTD 462 to allocate the space needed for new objectinstances and to create new object instances 478 of this type. Thecreate object routine 476 and the other system interface routines 466are the primary routines which must have detailed knowledge of theinternal data structure of object instances of this object type.

REFERENCE OBJECT IDS AND TEMPORARY OBJECTS

When an object has an outstanding pointer to it, its data structurescannot be deleted. There are two methods of preventing an object frombeing deleted: one for kernel mode routines and one for user moderoutines. The executive 144 (which operates in kernel mode) canincrement the pointer count field 364 when a routine is repeatedlyaccessing an object to prevent the object from being deleted. Auser-mode program can prevent an object from being deleted by creating areference ID to the object ID.

Referring to FIG. 11, there is shown an object 500 and a job levelcontainer 502 in which a pointer 504 to the object is stored. The object500 has a principal object ID 506 which indirectly references the object500 by way of the object pointer 504. Creating a reference ID 508creates another object ID for the object 500 which indirectly points tothe object 500 via a pointer 510 in another container 512.

When a reference ID is created for an object, the object ID count 366(see FIG. 8) in the object's header is incremented but the pointer count364 is not. This ensures that object ID count will not be decremented tozero, and that the object's storage cannot be deleted until thereference object ID is deleted.

The visibility of an object when it is created is the visibility of theobject container in which it is inserted. The visibility of an objectidentified by a reference ID is the visibility of the object containerspecified when the reference ID is created.

The level of the target container 512 specified when creating a newreference ID 508 must be less visible than the container in which theobject resides (i.e., the container corresponding to the principalobject ID 506). Additional reference IDs 520 can be created using othertarget containers 522. In general, a process 518 will usually generateonly one reference ID for an object. Therefore each reference ID for anobject is usually created using a different container, and in acontainer different from the container holding the object.

One reason for the constraint that reference IDs must be created using aless visible container than the source container is that creating areference ID cannot be used as a method of increasing the visibility ofan object. The only way to increase the visibility of an object is tomove the object to a more visible container. In general, only the ownerof an object has the authority to move the object to a more visiblecontainer.

Another reason for the constraint that reference IDs must be createdusing a different container than the source container is the system mustbe able to differentiate between reference and principal IDs. Both thereference IDs and the principal ID for the same object translate into apointer to the same object header.

Creating Reference IDs. Referring to FIG. 12, there is shown a flowchart of the process for creating reference IDs. The process starts whena thread calls the routine and provides as inputs an object ID for anobject and a target container ID that determines the visibility of theobject identified by the new object ID (box 550).

The new reference ID creation routine then acquires the mutexes for thetarget container directory, the target container, and the sourcecontainer directory (box 552).

Note that the "source container" is the container that holds the objectfor which a reference ID is being created.

Next, the source (input) object ID is translated into a pointer to theobject (box 554). At this point the routine aborts if the level of thetarget container is not less visible than the level of the sourcecontainer, or if the source object is an object container or containerdirectory.

Then an element in the object array of the target container is allocatedfor storing a pointer to the source object (box 556).

The source object's type specific mutex, referenced by the correspondingOTD, is acquired (box 558) for incrementing the object ID count in thesource object's header (box 560). Then a pointer to the source object isstored in the target container at the allocated index position (box562).

A reference ID (in the format shown in FIG. 7) is constructed using thetarget container directory, the allocated target container index, andthe sequence number of the source object (box 564). At this point allthe acquired mutexes are released (box 566) and the new reference ID isreturned 568 to the thread (i.e., user program) which called the createreference ID service routine.

Temporary Objects. Marking an object as temporary is used to cause anobject to be deleted when all of its reference IDs are deleted. This isparticularly useful when several processes or threads share the use ofan object because no one process or thread is required to be responsiblefor deleting the object (i.e., its principal ID) when all the processesare done using the object. Thus when an object is marked as temporary itis given a temporary lifetime which expires when all users of the objectare done with it, as signified by the deletion of all reference IDs forthe object.

Note that ordinary objects are deleted only when both the object IDcount 366 and the pointer count 364 for the object are equal to zero.Thus the principal ID of a non-temporary object must be explicitlydeleted before the object will be deleted.

When marking an object as temporary, if the object has no reference IDs,then the object's principal ID and the object itself are deletedimmediately. The only objects that can be marked as temporary reside atthe job or system levels because only objects at the job and systemlevels can have reference IDs.

An object is marked as temporary by acquiring the mutexes for theobject's container directory and container, and the object type-specificmutex, and then setting the temporary flag 390 (see FIG. 8) in theobject's header. A thread can mark an object as temporary only if it hasDelete Access to the object (see below discussion entitled AccessControl Lists).

An object can also be made temporary by moving it to an object containerat a more visible level and marking the moved object as temporary. Seethe discussion below entitled Moving An Object To A New Container. A newprincipal object ID is created for the object to denote its new level,container directory and container. The original principal object IDbecomes a reference object ID, thereby ensuring that the temporaryobject has at least one reference ID.

Deleting Object IDs. Referring to FIG. 13, there is shown a flow chartof the routine for deleting reference

IDs and object IDs and for automatically deleting objects when there areno remaining pointers to those objects. This routine also handles thedeletion of temporary objects --which are objects in which the temporaryflag 390 (see FIG. 8) in the object header is set.

The only input to the object ID deletion routine is the object ID to bedeleted (box 580). The routine acquires the mutex for the containerdirectory at the level specified in the object ID (box 582), andtranslates the object ID into a pointer to the object (box 584). If theobject ID's sequence number does not match the sequence number of theobject, the object ID is invalid and the routine exits.

Next, the object's container mutex and the object type-specific mutexare acquired (box 586) so that the object ID can be deleted and theobject ID count of the object can be decremented (box 588). If theresulting object ID count is equal to one (box 590), the routine checksto see if this is a temporary object (box 592). If not, the routineexits. If the object is a temporary object, one further test must beperformed before the object can be deleted.

Note that the principal object ID of an object can be deleted while oneor more reference IDs are outstanding. A temporary object is onlydeleted when all of its reference IDs have been deleted. When theprincipal object ID of an object is deleted, the container pointer 372in the object's header, which is also called the back pointer is resetto nil. Therefore the way to test to see if the principal object ID hasbeen deleted to is see if the back pointer in the object header is setto nil. If so, the object will be deleted only when the object ID countis decremented to zero.

Therefore, after determining that the object ID count is equal to oneand the object is a temporary object (boxes 590 and 592), the object IDdeletion routine checks to see if the object's back pointer is not equalto nil (box 594). If the back pointer is equal to nil, the principalobject ID was deleted and there is a reference ID still outstanding.Therefore the object cannot be deleted and the routine exits.

If the object's back pointer is not equal to nil, there are no remainingreference IDs. Therefore the principal object ID for the object isdeleted (box 596) and then object is deleted (box 598). Object deletionis done in two stages. First the remove routine for the object type iscalled to perform any object type-specific actions required to preparethe object for deletion. Then, when the object's pointer count reaches avalue of zero, the delete routine for the object type is called todeallocate the object's storage.

If the object's pointer count is not equal to zero, the object will bedeleted as soon as the object is dereferenced by the routines which holdpointers to it, which will cause the pointer count to be decremented.

If the object ID count was not equal to one (box 590), the routinechecks to see if the object ID count is equal to zero (box 599). If so,object deletion proceeds as discussed above (box 598). If the object IDcount is not equal to zero, the routine exits, having deleted the objectID and decremented the object's ID count.

It should be noted that the remove routine for the object is called whenthe object ID count reaches 0, and that the delete routine is calledwhen both the pointer count and the object ID count reach zero. Also theremove routine is called before the delete routine. See the abovediscussion of the remove and delete routines in the section entitledObject Type Descriptor.

MOVING AN OBJECT TO A NEW CONTAINER

In computer applications it is often desirable to share or hand-offaccess to the abstractions represented by objects. In the context of thepresent invention, sharing access to an object generally requires movingan object from its current object container to another object container.For example, an object can be transferred from a job level objectcontainer to a system level object container. This would make the objectaccessible throughout the system instead of just within a job. A objectmay also be transferred from a process level container to a job levelcontainer, or from a process private container to a process displaycontainer.

As described above with reference to FIG. 8, the object header of eachobject instance has a transfer flag 392. The transfer flag 392, whenclear, indicates that the object cannot be transferred to anothercontainer. In addition, objects with a non-zero number of reference IDscannot be transferred to a new container.

When an object is transferred to a new container a new object ID iscreated for the object using a new container, the object's name istransferred to the new container, and the current object ID is deleted.

Referring to FIG. 14, there is shown a flow chart of the routine formoving an object to a specified container. The input parameters (box620) to the routine are the object ID of the object to be transferred,the object ID of the target container to which the object is to betransferred, and a "delete upon collision flag", the purpose of whichwill be explained below.

The routine begins by acquiring the mutex for the current containerdirectory level of the object (box 622) and translating the specifiedobject ID into a pointer to the object (box 624). Then the object'stransfer flag is tested and the ID count is checked to make sure it isequal to 1 (box 626). If the transfer flag is clear, or the ID count isnot equal to 1, the specified object cannot be transferred and theroutine aborts. Otherwise, the routine continues by obtaining themutexes for the target container directory level and the targetcontainer (box 628).

Next, the routine checks for a collision (box 630). A collisionsituation exists when an object of the same type and name as thespecified object exists in the target container. If the "delete uponcollision flag" is clear and a collision occurs (box 632), the routineaborts. When the "delete upon collision flag" is set, the originalobject is deleted and the routine returns the object ID of the duplicateobject in the target container (box 634).

If a collision does not occur (box 630), an object index is allocated inthe target container, a new principal object ID is created for theobject, the object's name and a pointer to the object are stored in thetarget container, the source (input) object ID is deleted, the mutexesare released, and the routine returns the new object ID to the caller(box 636).

As noted above, an object can be made temporary when it is moved to amore visible container. The reason for making such objects temporary isthat in many situations no one process can take responsibility fordeleting an object. By providing temporary objects, the presentinvention provides a mechanism for automatically deleting such objectswhen no process retains a reference ID to the object. The routine formoving an object to a more visible container and making an objecttemporary is basically the same as the move object routine shown in FIG.14, except that (1) the object is marked as temporary, and (2) insteadof deleting the original object ID, the routine replaces it with areference ID so that the temporary object will not be deletedimmediately.

TRANSFERRING AN OBJECT CONTAINER

In systems using the present invention, a large portion of a program'scontext is contained in object instances. By being able to transferobject instances from a creating program to a created program, a newprogram's context can be passed to a newly created process. The objectcontainers always present for a process are a job level objectcontainer, a process level private container, and a process leveldisplay container (i.e., a container which is automatically accessibleto subprocesses created by this process).

When creating a new job, it is possible to transfer entire objectcontainers of object instances to be used for any or all of the objectcontainers used by the job. When creating a process, it is possible totransfer an entire object container of object instances to be used asthe initial process private object container, or the process displaycontainer, or both. In either case, when object containers aretransferred in this fashion, they become inaccessible to the creator ofthe new job or process because the new container is generally not in thevisibility range of the creator process.

When transferring an object container of object instances in thisfashion, the object containers provided by the creating program arecalled the source object containers. The object instances contained inthe source object containers are called source object instances.

Referring to FIG. 15, there is shown a flow chart of the routine fortransferring an object container to a specified container directory. Theinput parameters (box 660) to the routine are the object ID of thesource object container to be transferred, and the object ID of thetarget container directory to which the source object container is to betransferred.

The routine begins by acquiring the mutex for the source containerdirectory level of the source object container (box 662) and obtaining apointer to the source object container (box 664). Then the objectcontainer's transfer flag is tested (box 666). If the transfer flag isclear, the container is not transferable and the routine aborts.Otherwise, the routine continues by checking all the object IDs in thecontainer (boxes 666, 668 and 670). In order for the container to betransferable, all the objects in the container must be transferable, andall must have an ID count equal to 1 (i.e., there must be no referenceIDs for any of the objects in the source container) (box 668). If any ofthe objects in the container do not meet this criteria, the routineaborts.

Next, all the reference IDs in the source object container, if any, arechecked to make sure that all the objects referenced are system levelobjects (i.e., have a level value 376 in the object header whichdesignates the system level) (box 670). If not, the routine aborts.

If all the above tests were passed, the routine continues by acquiringthe mutex for the target container directory (box 672). Then it adds apointer to the source object container in the target containerdirectory, updates the source container's header (i.e., the containerpointer field 372) to point to the target container directory, removesthe pointer to the source container from the source container directory,and finally releases all the acquired mutexes (box 674). As a result thespecified object container has been transferred to the specified targetcontainer directory, typically for a newly created job or a newlycreated process.

CREATE IF OBJECT NOT ALREADY PRESENT

Within a computer application, it is sometimes necessary for severalprograms to work in conjunction with one another. In this environment,it is not unusual for the programs to share access to the abstractionsrepresented by objects. In some cases it is difficult to determine, orat least not relevant to the problem being solved, which program will beready to access the shared objects first.

The present invention provides a condition object creation routine whichcreates an object if it is not already present, herein called the CreateIf semantic. This allows a set of application programs to all bedesigned as if they were to all create each shared object. When anapplication attempts to create a shared object, the conditional objectcreation routine checks to see if the object already exists. If so, thenthe attempt to create the object simply returns the object ID of thealready existing object.

Referring to FIG. 16, the conditional object creation routine requiresinputs of the object type of the object to be created, the object ID ofthe target container in which the object is to reside, and a name thatis to be assigned to the object (box 720). The routine begins byacquiring the mutex for the target container directory level (box 722).Then it checks the list of objects in the target container to see ifthat container already contains an object with the specified name andtype (box 724). If such an object does not already exist, the routineacquires the required mutexes for creating a new object (box 728). Thenit creates the specified object in the target container, releases theacquire mutexes, and returns the object ID of the new object to thecaller (box 730).

Otherwise, if the specified object already exists, the routine returnsthe object ID of the object which already exists in the target container(box 732).

ACCESS CONTROL LISTS

Any resource in the computer system can be protected so that onlycertain users can access it, or the resource can be left unprotected sothat all users can access it. The present invention controls access toresources by checking the user's access rights against the resource'saccess control information to verify that the user has access to theresource.

Any resource that needs to be protected must be an object or must havean object associated with it. The access to a resource is checkedindirectly by the executive's routine which translates an object ID intoa pointer to an object. Whenever a program references an object by itsobject ID, the access rights of the user are compared with the accesscontrol information in the object.

Each user of the system is given a set of access rights in the form ofan "ID list". Access rights represent the user's claims to resources onthe system. Access rights are kept in each thread owned by a user.Referring to FIG. 17, the thread control block 800 (which is part of theobject body of a thread object) of a thread contains a mode value 802,and a pointer 804 to an ID list 806.

The mode 802 is the processor mode in which the thread is executing. Themode is either User or Kernel. The ID list 806 contains a list of 32-bitvalues called identifiers 808, 810, 812, the first of which is calledthe "user identifier" because it is unique to each user of the system.The identifiers represent who the user is and what groups he is a memberof. The user is assigned the same identifiers each time that he gainsaccess to the system. Each identifier also has an alphanumeric name atthe human interface level.

In some circumstances, a thread can have two distinct ID lists 806 and815, where the first list 815 is the list originally given to thethread, and the second list 806 is a list adopted temporarily forexecuting a set of tasks for another process.

The preferred embodiment of the present invention does not provide"privileges" in the access rights of a user. Instead, privileged accessto objects is implemented using identifier lists and access control onobjects.

Each object 822 has access control information that describes the accessrights needed by a user to gain access to a resource. The object header820 contains the access control information.

The access control information of an object is made up of three parts: amode, an owner identifier, and an access control list (ACL). The mode isthe processor mode (User or Kernel) in which the object was created. Theowner identifier is the user identifier of the object which created theobject. The ACL is a list of one or more access control entries.Referring to FIG. 17, the header 820 of an object 822 contains a pointerto the access control list 824 for the object 822, if any.

The ACL 824 contains an ACE count 826, which is equal to the number ofaccess control entries (ACEs) 828, 830, 832 in the ACL. There are twotypes of access control entries: access entries and audit entries. Eachaccess entry 828 contains an ACE type value 840 which indicates this isan access entry, an ACE Mask 842 which indicates the type of accessgoverned by this ACE, a Stop Flag 844 explained below, and an ID count846 which specifies the number of identifiers there are in the entry'sID list 848. In order to gain access to the object, the thread'sidentifier list 806 must contain identifiers matching all theidentifiers in the ACE's ID list 848, and the type of access requestedmust be a subset of the access types specified by the ACE Mask 842.

                  TABLE 2                                                         ______________________________________                                        ACCESS MASK                                                                   MASK BIT ACCESS TYPE   DESCRIPTION                                            ______________________________________                                        01       READ          Read data from Object                                  02       WRITE         Write data into Object                                 03       DELETE        Delete Object                                          04       WAIT          Wait for signaling of Object                           05       ALLOCATE      Allocates Object                                       06       SET ACL       Sets/Changes ACL of                                                           Object                                                 07       SET NAME      Sets Name of Object                                    08       SET OWNER     Sets Owner of Object                                   09       GET INFO      Gets general information                                                      about Object                                           17-32    --            Object Specific Access                                                        Types                                                  EXAMPLE: QUEUE OBJECT                                                         17       ADD HEAD      Add item to Head of Queue                                                     Object                                                 18       ADD TAIL      Add item to Tail of Queue                                                     Object                                                 19       REMOVE HEAD   Remove item from Head of                                                      Queue Object                                           20       REMOVE TAIL   Remove item from Tail of                                                      Queue Object                                           EXAMPLE: OTD OBJECT                                                           17       CREATE OBJECT Create Object of the type                                                     specified by the OTD                                   EXAMPLE: PRIVILEGED OPERATION OBJECT                                          17       PERFORM       Perform Privileged                                              OPERATION     Operation                                              ______________________________________                                    

Referring to Table 2, the Access Mask 842 is a set of 32 bit flags whichindicate various types of access. For instance, if bit 01 is set in theAccess Mask 842, then the ACE 828 governs READ access to the object. Ifbit 02 is set in the ACE Mask 842, the ACE 828 governs WRITE access tothe object. The first sixteen bits of the ACE Mask 842 concern standardtypes of access which apply to all types of objects.

The second sixteen bits of the ACE Mask 842 are object type-specific.For instance, OTD objects use ACE Flag 17 as the bit for "CreateAccess"--i.e., the right to create objects of the type specified by theOTD object. Table 2 also shows an example of object type-specific accesstypes of a queue object.

Referring to FIG. 9, the access mask 412 in each OTD is a bit mask whichis used in conjunction with access control lists. In particular, theaccess mask 412 determines which types of access are defined for objectsof the type corresponding to the OTD. The only types of access allowedto objects of that type are access types for which the correspondingbits are set in the access mask 412. The definitions for the bits in theaccess mask 412 have a one to one correspondence to the definitions forthe bits in the ACE Mask 842 of each ACE 828.

Referring to FIG. 17, the purpose of audit ACE's such as ACE 832 is tomonitor access to an object. Each audit ACE 832 contains an ACE type 850which specifies that this is an audit ACE.

The Audit Flags field 852 contains three flags that, when set, modifythe characteristics of the audit to be performed. These flags arespecific to one audit ACE. The Audit Flags include a Success Flag, aFailure Flag, and an Alarm Flag. When the Success Flag is set, the auditACE is checked whenever access is granted by the system's accesschecking routine. The Failure Flag, when set, specifies that the AuditACE should be checked whenever access is denied by the system's accesschecking routine. The Alarm Flag is examined if a message is generatedfrom the Audit ACE. This flag, when set, specifies that the type ofmessage generated from the Audit ACE is an alarm message. If the AlarmFlag is clear, an audit message is generated. An audit message signifiesthe occurrence of a normal event. The message can be written to a logfile and examined later. An alarm message signifies the occurrence of anabnormal event. Alarm messages are typically logged to a securityconsole so that immediate action can be taken by the security manager.

The monitor flags 854, which correspond to the ACE Flags and the bits inthe access mask 412 for the OTD, indicates the types of access to bemonitored by the Audit ACE 832. The Audit Name 856 is the name of themessage unit (or channel) into which the messages generated by the auditACE are written.

Appendix 1 contains a pseudocode representation of the process forchecking the ACL of a specified object and determining whether a user isto be granted access to the specified object. The pseudocode program inAppendix 1 at the end of this specification is written using universalcomputer programming conventions and are designed to be understandableto any computer programmer skilled in the art. Comments and unexecutablestatements begin with a double asterisk "**".

According to the steps of the ACL checking process as shown in Appendix1, access is denied if the access desired by the caller of the checkaccess routine is not supported by the object. If the access typedesired is supported by the object, and the caller's access mode isKERNEL, then access is automatically granted. In other words, accesschecking beyond checking for supported types of access is performed onlyfor USER mode callers.

If the object does not have an ACL and the mode of the object is USER,access is granted. Otherwise the mode of the object is KERNEL and accessis denied.

If the object does have an ACL the following steps are performed foreach access ACE in the ACL. If the user's ID list holds the identifierslisted in the ACE's ID List 848, then if the access desired is allowedby the access ACE, access is granted. However, if the user's ID listholds the identifiers listed in the ACE ID List but the type of accessdesired is not allowed by this access ACE then the Stop Flag 844 of theACE is inspected. If the Stop Flag 844 is set, this means that no moreACEs should be examined, and access is denied. If the Stop Flag 844 isnot set, the access checking process continues to examine any additionalACEs there may be in the ACL.

This process continues until either all the access ACEs have beenchecked, or the caller is positively denied access.

The purpose of the Stop Flag 844 is to explicitly prevent specifiedusers from accessing an object, or to explicitly limit their access tocertain specified access types. To prevent or limit access to an objectby a specified user (or set of users), the ACL for the object is givenan ACE 828 with a set Stop Flag 844, an ID list 848 that specifies thisuser (or set of users), and an ACE Mask 842 that lists the access types(if any) allowed to the specified user. When the specified user tries toaccess the object 822, the access checking routine will not inspect anyACEs after the ACE with the set Stop Flag.

One last type of access is allowed: if the caller holds the object'sowner ID, then the caller is allowed "SET ACL" access to theobject--which allows the caller to modify the object's ACL.

PRIVILEGED OPERATION OBJECTS

As stated above, the object based architecture of the preferredembodiment does not have "privileges". In the present invention, thenumber of allowable privileged operations is not limited, unlike mostprior art system which allocate privileges to the users of the system.Identifiers and Access Control Entries (ACEs) in access control listsare used instead of privileges. For example, a user may create a newcontainer and then specify that it be inserted into the system-levelcontainer directory. Because the container directory is at the systemlevel, this is a restricted operation.

To control usage of a restricted operation, such as adding objectcontainers to the system container directory, an ACL is added to thesystem level container directory. An identifier, called SYSTEM₋₋ LEVEL,is created and given to the group of users who are to be allowed insertobject containers into the system level container directory. Morespecifically, the ACL for the system level container directory containsa separate ACE for controlling WRITE access to the container directory.The identifier list for this ACE contains just one identifier: theSYSTEM LEVEL identifier. Thus any user that is granted this identifiercan insert a new container into the system-level container directory.

As can be seen by the previous example, access to most privilegedoperations is controlled simply by using the ACL mechanism to determinewhich users have access to a corresponding object. Some privilegedoperations, however, do not inherently reference an object. For example,setting the system time is a privileged operation, but does not involvean object. To protect this privileged operation from unauthorized use, aspecial object is created and the privileged operation is defined toreference the special object. More specifically, the code for theprivileged operation is modified so that it will perform the privilegedoperation only if the user has a predefined type of access (i.e.,PERFORM OPERATION access) to the special object.

Referring to FIG. 18, this special object is herein called a PrivilegedOperation Object 930. If a user (i.e., thread) has access to aparticular Privileged Operation Object, then the user is allowed toperform the corresponding operation 932. If a user does not have accessto a particular Privileged Operation Object, then the user is notallowed to perform the corresponding operation.

Thus, a Privileged Operation Object represents a privileged operation.Each privileged operation that does not inherently reference an objecthas a privileged operation object associated with it. The name assignedto the privileged operation object is usually the name of the privilegedoperation. The ACL 934 on the privileged operation object determines theusers who can perform the privileged operation.

More specifically, a user must have PERFORM OPERATION access to theprivileged object in order to perform the corresponding privilegedoperation. This means that (1) the routine 932 which runs the privilegedoperation verifies access (box 936) to a specific one of the accesstypes for the privileged operation object (i.e., an object specific typeof access), (2) the privileged operation object has an ACL which listsone or more identifiers needed for the specified type of access, andthus (3) the user's ID list 938 must include the identifier(s) listed inthe ACL in order to be able to use the privileged operation. PERFORMOPERATION access means having identifier(s) which match those in the ACLfor the Privileged Operation Object.

For example, the object used to control access to the routine forsetting the system's clock is called the SET₋₋ SYSTEM₋₋ TIME privilegedoperation object. A user must have PERFORM OPERATION access to the SET₋₋SYSTEM₋₋ TIME privileged operation object in order to set the system'sclock. This means that the user's ID list must contain all theidentifiers included in the access ACE which governs PERFORM OPERATIONaccess to the SET₋₋ SYSTEM₋₋ TIME privileged operation object.

A privileged operation object is created by calling a object creationservice routine which uses the OTD for Privileged Operation Objects tocreate a new object. Note that the length of the object body ofPrivileged Operation Objects is zero. The creator of the object insertsin the object an ACL which defines the identifier(s) needed in order tohave PERFORM OPERATION access to the object. All Privileged OperationObjects are stored in a specific system level container called thePrivileged Operation Container 939.

Privileged Operation Objects are a distinct object type, and thus have adistinct OTD 940 (object type descriptor) which defines the format androutines which support this object type. The ACL 942 for the PrivilegedOperation Object OTD has an object specific access type, called CREATEOBJECT access. See the above discussion for object specific accesstypes.

Only users 944 with CREATE OBJECT access (see Table 2) to the PrivilegedOperation Object OTD are allowed to create privileged Operation ObjectsThus the ACL mechanism for Privileged Operation Object OTD prevents theproliferation of privileged operation objects that might otherwise becreated by unauthorized users. More specifically, a special identifiercalled CREATE .PRIVILEGED OPERATION OBJECT is included in an AccessControl Entry for the ACL 942 for the Privileged Operation Object OTD940. Only users 944 who have this special identifier in their ID list946 are allowed to generate new privileged operation objects.Conceptually, the OTD for privileged operation objects can be consideredto be a special type of privileged operation object because it protectsthe privileged operation of generating new privileged operation objects.

OBJECT ALLOCATION

An object may be allocated to a user object, job object, process objector thread object. Generally, the purpose of object allocation is to givea particular user, job, process or thread exclusive use of a particularsystem resource. For instance, an object representing a computerterminal may be allocated to a specified job object. An object may alsobe allocated to an "allocation identifier object", which is a specialtype of object that is used to give a predefined set of users exclusiveaccess to a system resource, such as a tape drive. Object allocationdiffers from the access control lists in that object allocation preventsaccess by threads which would otherwise be authorized to access aparticular object according to the object's ACL.

The visibility level of an object determines the level of the allocation"class" (i.e., visibility level of the allocation object) to which theobject can be allocated. For instance, an object at the system level canbe allocated to any of the five types of allocation classes (user, job,process, thread, or allocation identifier), but an object at the processlevel of visibility can only be allocated to process and thread objects.

Referring to FIG. 19, when a object 900 is allocated an allocation block902 is created and the allocation block 902 is linked into a list ofallocation blocks 905 for the allocation object 908 to which the object900 has been allocated. When an object 900 is allocated, a pointer tothe allocation block 902 is stored in the header of the allocated object900.

The list head 910 for the list of allocation blocks 905 is stored in thebody of the allocation object 908, at the position in the object bodyspecified by the Allocation List Head Offset field 389 in the allocationobject's header (see FIG. 8).

Each allocation block 902, 912, 914 contains a forward link 920 and abackward link 922 for forming a doubly linked list 905 of allocationblocks. An allocation type field 924 indicates whether the allocationobject is a user object, job object, process object, thread object, oran allocation identifier object. The allocation ID field 926 containsthe ID of the allocation object 908, and the object pointer field 928points to the header of the object that has been allocated.

Note that an object cannot be allocated unless its object ID count isequal to one, because the existence of one or more outstanding referenceIDs indicates that other threads need access to the object.

Whenever a thread attempts to access an object by translating an objectID, the access checking routine checks to see if the allocation blockpointer in the object header has a non-zero value. If so, this indicatesthat the object ID refers to an object that has been allocated.

It then checks to see if the object has been allocated to an object thatcorresponds to the thread. If so, access is allowed, otherwise it isdenied.

WAITABLE OBJECTS

Computer applications and operating systems often need synchronizationmechanisms to help coordinate access to resources or data. The presentinvention provides a set of "kernel synchronization primitives", whichare incorporated in "waitable objects" for synchronizing processes withspecified events. Waitable objects are user accessible objects which canbe "waited on"--which means that a thread can be suspended until thestatus of the waitable object is changed to a predefined state called"signalled".

As will be discussed below, the present invention enables users not onlyto generate new instances of predefined types of waitable objects, butit also allows users to define new types of waitable objects withouthaving to modify the wait service routines and the scheduler in theoperating system's kernel. Thus users of the system can createcustomized waitable objects without having any detailed understanding ofhow the kernel's wait servicing software works.

Referring to FIG. 20, when an object 950 is designated as a waitableobject, then its object body 952 includes a kernel synchronizationprimitive 954. The position of the kernel synchronization primitive 954in the object body 952 30 is specified by the dispatcher pointer 381 inthe object's header.

Kernel synchronization primitives, which are sometimes called dispatcherobjects or kernel synchronization objects, and the objects in which theyreside, are defined to be in one of two states: Unsignalled, orSignalled.

These states are said to be the signal state of the object or kernelsynchronization primitive.

The system provides executive wait service routines 956 and kernel waitservice routines 960 for use by programs needing to synchronizeactivities. These service routines will be discussed in more detailbelow.

The preferred embodiment provides four types of kernel synchronizationprimitives that can be used in user accessible objects. These primitivesare as follows.

A notification event remains signalled until explicitly unsignalled.

A synchronization event, once signalled, remains signalled until a waitis satisfied. Satisfaction of a wait automatically changes the state tounsignalled.

A semaphore is used to control limited, but not exclusive, access to aresource. A semaphore is created with an initial count. As long as thatcount is non-zero, then the semaphore is signalled. The count isdecremented each time a wait on the semaphore is satisfied.

A timer is used to wait for a specific amount of time to pass. A timercontains an expiration time. Initially, a timer is unsignalled. When theexpiration time occurs, the timer is changed to signalled.

Mutexes are the kernel synchronization primitive used to controlexclusive access to a resource. The state of a mutex is controlled by acount. When the count is 1 (signalled state), the mutex is not owned andaccess to the resource associated with the mutex can be allowed.Granting ownership of a mutex causes the count to be decremented to 0(unsignalled state), whereupon no other thread is able to gain access tothe resource until the owner thread releases the mutex. Waiting on(acquiring) a mutex suspends the execution of the invoking thread untilthe mutex count is 1. Satisfying the Wait causes the count to bedecremented to 0 and grants ownership of the mutex to a waiting thread.Mutexes, generally, cannot be incorporated into the body of a useraccessible object in order to form a waitable object. This is becausemutexes must be used only in contexts where the mutex is held for shortperiods of time. Notification and synchronization events are used incontexts where a thread will need exclusive access to a system resourcefor a longer period of time.

Wait requests are requests by threads to be synchronized with aspecified waitable object by suspending the thread until the specifiedwaitable object is signalled. The kernel synchronization primitive 954(in the waitable object 950) includes a Wait Type field 962 whichspecifies the type of the kernel synchronization primitive. A WaitStatus field 964 which indicates whether the kernel synchronizationprimitive is signaled or unsignalled, and also stores such parameters asthe count for a semaphore and the expiration time for a timer. A waitlist head 966 points to a list 970 of wait references 972, 974. Eachwait reference denotes one thread 976 which is waiting on the kernelsynchronization primitive.

The kernel wait service routines 960 include the following routines forcontrolling the state of kernel synchronization primitives. Set₋₋ Eventis used to set the state of either a notification or synchronizationevent to signalled. Clear₋₋ Event is used to set the state of either anotification or synchronization event to unsignalled.

Pulse₋₋ Event is used to set the state of either a notification orsynchronization event to signalled and then immediately changes it tounsignalled. When used with a notification event, this has the effect ofsatisfying all current wait requests, while preventing future requestsfrom being satisfied.

Release₋₋ Semaphore is used to cause the semaphore's count to beincremented. If the count is incremented from zero to one, then thestate of the semaphore is changed to signalled.

Set₋₋ Timer is used to set the expiration time of a timer kernelsynchronization primitive. This causes the timer to become unsignalled.

When a wait operation is to be performed by a user process on one ormore specified waitable object instances 950, the user process calls oneof two execute wait service routines 956: "Executive Wait Single" or"Executive Wait Multiple". These executive wait service routines acceptthe object IDs of one or more waitable objects. Executive Wait Singlesuspends the issuing program until a specified waitable object becomessignalled. Executive Wait Multiple can be used to wait on two or morespecified waitable objects. The Executive Wait Multiple routine has twomodes of operation which can be specified by the user: it either (1)suspends the issuing program until any of the specified waitable objectsbecomes signalled, or (2) suspends the issuing program until all of thespecified waitable objects become signalled. A timeout value may also,optionally, be supplied to indicate that if the wait has not completedafter the timeout has expired, the program should resume anyway.

The kernel wait service routines 960 include two corresponding routines:"Wait Single" and "Wait Multiple". The difference between the executiveand kernel versions of these routines is that the executive routines arecalled by a process which specifies the object IDs of one or morewaitable objects, while the kernel routines are called by the executivewhich specifies pointers to kernel synchronization primitives that areto be waited on.

When a user process calls one of the executive wait routines itspecifies the object ID(s) of the waitable object(s) that it wants towait on. The executive wait routine translates each specified object IDsinto an object pointer, and then inspects the Dispatcher Pointer 381 inthe referenced object to make sure that the object is a waitable object.If the Dispatcher Pointer is not nil, the referenced object is awaitable object. The executive then calls one of the kernel waitroutines 960 to perform a kernel wait operation on the kernelsynchronization primitive 954 pointed to by the Dispatcher Pointer 381.

When a wait request completes normally (that is, does not time-out) thewait is said to have been satisfied.

Waitable objects are created by storing the data structure for an kernelsynchronization primitive in the object body of an object instance (atan position in the object body specified by the Dispatcher Offset field410 of the OTD for this object type), setting the Dispatcher Pointer 381in the object header to point to the kernel synchronization primitive,and then calling a corresponding kernel service routine for initializingthe dispatcher object. Once initialized, the kernel synchronizationprimitive can then be manipulated by using other kernel wait serviceroutines.

As discussed above with reference to FIG. 10, it is a feature of thepresent invention that there is a simple procedure for defining newtypes of objects and a corresponding set of object type-specificroutines for interacting with the system. As shown in FIG. 10, all OTDsare objects stored in a system level container 460 called the OTDContainer. To define an new type of waitable object the same procedureis used as for creating other object types. The primary specialconsiderations for creating new types of waitable objects are asfollows.

The OTD for a new type of waitable object must provide a non-negativedispatcher offset 410 which specifies the position of a kernelsynchronization primitive in the object body. In addition, the routine440 for creating new instances of this object type must store the datastructure for an kernel synchronization primitive in the object body ofan object instance, set the Dispatcher Pointer 381 in the object headerto point to the kernel synchronization primitive, and then call acorresponding kernel service routine for initializing the dispatcherobject. Finally, if the new type of waitable object needs to beexplicitly signalled or unsignalled by user mode programs, the creatorof the new waitable object type must provide an executive interface thatcan be called by user mode threads. The executive interface for thewaitable object comprises one or more executive wait service routineswhich call the appropriate kernel wait service routines for signallingand unsignalling specified waitable objects of this type.

For example, it would be possible to create a new type of waitableobject called a Waitable Privileged Operation Object. In this example, asemaphore kernel synchronization primitive would be incorporated in theWaitable Privileged Operation Object. The purpose of making a WaitablePrivileged Operation Object that incorporates a semaphore would be tolimit the number of users which simultaneously perform a particularprivileged operation. To perform this particular privileged operation, auser would have to wait on the privileged operation object until thesemaphore's count value is non-zero.

ALTERNATE EMBODIMENTS

While the present invention has been described with reference to a fewspecific embodiments, the description is illustrative of the inventionand is not to be construed as limiting the invention. Variousmodifications may occur to those skilled in the art without departingfrom the true spirit and scope of the invention as defined by theappended claims. ##SPC1##

What is claimed is:
 1. A computer system, comprising:memory means forstoring data and data structures; a multiplicity of processes runningconcurrently in said computer system; a multiplicity of objectscomprising data structures stored in said memory means, and a principalobject identifier corresponding to each of said objects; each objectincluding flag means in said object for storing a value denoting whethersaid object is a temporary object; identifier creating means, responsiveto requests by any of said multiplicity of processes, for creating atleast one additional object identifier for a specified object and fordenoting in said specified object the number of additional objectidentifiers corresponding to said specified object; object markingmeans, responsive to a request by any of said multiplicity of processes,for storing a value in said flag means of said specified objectindicating that said specified object is a temporary object and forinvoking said identifier creating means to create one additional objectidentifier for said specified object; identifier deleting means,responsive to requests by any of said multiplicity of processes, fordeleting a specified one of said additional object identifiers anddecrementing the number of said additional object identifiers denoted inthe object corresponding to said specified object identifier; and objectdeleting means for deleting one of said multiplicity of objects which isnot a temporary object when said one object's principal objectidentifier is deleted by any one of said multiplicity of processes andsaid number of additional object identifiers for said one object iszero; said object deleting means also including temporary objectdeleting means, coupled to said identifier deleting means, for deletingthe principal object identifier and the object corresponding to saidspecified additional object identifier deleted by said identifierdeleting means when said corresponding object is a temporary object andsaid number of additional object identifiers for said correspondingobject is decremented to a value of zero; whereby a temporary object isautomatically deleted when all additional object identifiers for theobject have been deleted, while an object that is not a temporary objectis deleted by said object deleting means when both its primary objectidentifier and all its additional object identifiers have been deleted.2. A computer system, comprising:memory means for storing data and datastructures; a multiplicity of processes running concurrently in saidcomputer system; a multiplicity of objects comprising data structuresstored in said memory means; a multiplicity of object identifiers, atleast one said object identifier corresponding to each said object; eachsaid object including count means for denoting the number of objectidentifiers corresponding to said object and a temporary status flagdenoting whether said object is temporary; identifier creating means forcreating additional object identifiers for a specified object and forincrementing the number denoted by the count means of said specifiedobject each time that a corresponding additional object identifier iscreated; and object marking means, responsive to a request by any ofsaid multiplicity of processes, for storing a value in said temporarystatus flag of said specified object indicating that said specifiedobject is a temporary object and for invoking said identifier creatingmeans to create one additional object identifier for said specifiedobject; identifier deleting means for deleting a specified objectidentifier and for decrementing the number denoted by the count means ofthe object corresponding to said specified object identifier, saididentifier deleting means including means for deleting the objectcorresponding to said specified object identifier when said numberdenoted by said count means is decremented to a value of zero; saididentifier deleting means further including means for deleting theobject corresponding to said specified object identifier when saidtemporary status flag for said corresponding object is set and saidnumber denoted by said count means for said corresponding object isdecremented to a value of one; whereby a temporary object isautomatically deleted when all additional object identifiers for theobject have been deleted.
 3. A computer system as set forth in claim 2,further including a multiplicity of container means, stored in saidmemory means, for referencing sets of said objects, each container meansincluding means for storing a multiplicity of object pointers tolocations in said memory means where said set of objects are stored;each said object pointer in said multiplicity of object container meanscorresponding to one of said object identifiers;said identifier creatingmeans including means for storing an additional object pointer,corresponding to said additional object identifier, in a different oneof said container means than ones of said container means which alreadystore an object pointer for said specified object.
 4. A computer systemas set forth in claim 2, further including a multiplicity of containermeans, stored in said memory means, for referencing sets of saidobjects, each container means including means for storing a multiplicityof object pointers to locations in said memory means where said set ofobjects are stored; each said object pointer in said multiplicity ofobject container means corresponding to one of said objectidentifiers;said identifier creating means including means for storingan additional object pointer, corresponding to said additional objectidentifier, for said specified object in a specified one of saidcontainer means, said identifier creating means including means forstoring said additional object pointer in said specified container meansonly when said specified container means does not already store anobject pointer to said specified object.
 5. A computer system as setforth in claim 4, including a multiplicity of execution threads, eachexecution thread having associated therewith a subset of said containermeans, andreference means, coupled to said identifier creating means,responsive to requests by any of said multiplicity of execution threads,for invoking said identifier creating means to create an additionalobject identifier for a specified object and storing a correspondingobject pointer in a specified one of said container means associatedwith the requesting execution thread, thereby incrementing the numberdenoted by the count means of said specified object; wherein saidspecified object cannot be deleted by said identifier deleting meansuntil said additional object identifier created by said reference meansis deleted.
 6. A computer system, comprising:memory means for storingdata and data structures; a multiplicity of processes runningconcurrently in said computer system; a multiplicity of objectscomprising data structures stored in said memory means; a multiplicityof object identifiers, including one principal object identifiercorresponding to each said object, each object identifier referencingone of said objects; each said object including count means for denotingthe number of object identifiers corresponding to said object and atemporary status flag denoting whether said object is temporary;identifier creating means for creating additional object identifiers fora specified object and for incrementing the number denoted by the countmeans of said specified object each time that a corresponding additionalobject identifier is created; and object marking means, responsive to arequest by any of said multiplicity of processes, for storing a value insaid temporary status flag of said specified object indicating that saidspecified object is a temporary object and for invoking said identifiercreating means to create one additional object identifier for saidspecified object; identifier deleting means for deleting a specified oneof said object identifiers and for decrementing the number denoted bythe count means of the object corresponding to the deleted objectidentifier, said identifier deleting means including means for deletingthe object corresponding to the deleted object identifier when saidnumber denoted by said count means is decremented to a value of zero;said identifier deleting means further including means for deleting theobject corresponding to said specified object identifier when saidtemporary status flag for said corresponding object is set and saidnumber denoted by said count means indicates that there are noadditional object identifiers for said corresponding object; whereby atemporary object is automatically deleted when all additional objectidentifiers for the object have been deleted.
 7. A computer system asset forth in claim 6, further including:a multiplicity of containermeans, stored in said memory means, for referencing sets of saidobjects, each container means including means for storing a multiplicityof object pointers to locations in said memory means where said set ofobjects are stored; each said object pointer in said multiplicity ofobject container means corresponding to one of said object identifiers;each said object identifier including an authenticating value; each ofsaid objects including an object authenticating value matching theauthenticating value in the object identifier corresponding to saidobject; said identifier creating means including means for duplicatingin said additional object identifier said authenticating value in saidspecified object.
 8. A computer system as set forth in claim 7, furtherincludingobject identifier translating means for translating a specifiedobject identifier into a pointer to the corresponding object, includingmeans for locating an object pointer, corresponding to said specifiedobject identifier, in one of said container means, and means forverifying that the object pointed to by said located object pointer hasan object authenticating value matching the authenticating value in saidspecified object identifier.
 9. A computer system as set forth in claim7, including a multiplicity of execution threads, each execution threadhaving associated therewith a subset of said container means,andreference means, coupled to said identifier creating means,responsive to requests by any of said multiplicity of execution threads,for invoking said identifier creating means to create an additionalobject identifier for a specified object and storing a correspondingobject pointer in a specified one of said container means associatedwith the requesting execution thread, thereby incrementing the numberdenoted by the count means of said specified object; wherein saidspecified object cannot be deleted by said identifier deleting meansuntil said additional object identifier created by said reference meansis deleted.
 10. In a computer system having:memory means for storingdata and data structures; a multiplicity of processes runningconcurrently in said computer system; a multiplicity of objectscomprising data structures stored in said memory means, and amultiplicity of object identifiers, including a principal objectidentifier corresponding to each of said objects; a method of using anddeleting objects stored in said computer system comprising the steps of:creating at least one additional object identifier for a specifiedobject and denoting in said specified object the number of objectidentifiers corresponding to said specified object; in response torequests by ones of said multiplicity of processes, denoting inspecified ones of said multiplicity of objects that said specifiedobjects are temporary; in response to an object identifier deletionrequest by any one of said multiplicity of processes, deleting aspecified one of said object identifiers and decrementing the number ofsaid object identifiers denoted in the object corresponding to thedeleted object identifier; deleting the principal object identifier andthe object corresponding to the deleted object identifier when saidobject is denoted as temporary and said number of object identifiers forsaid corresponding object is decremented to a value of one; deleting theobject corresponding to the deleted object identifier when said objectis not denoted as temporary, said number of object identifiers denotedin said corresponding object is zero and said principal objectidentifier for said specified object has been deleted; whereby atemporary object is automatically deleted when all additional objectidentifiers for the object have been deleted, while an object that isnot a temporary object is deleted when its primary object identifier andall its additional object identifiers have been deleted.
 11. The methodset forth in claim 10,said computer system including a multiplicity ofcontainer means, stored in said memory means, for referencing sets ofsaid objects, each container means including means for storing amultiplicity of object pointers to locations in said memory means wheresaid set of objects are stored; each said object pointer in saidmultiplicity of object container means corresponding to one of saidobject identifiers; said creating step including the step of storing anadditional object pointer, corresponding to said additional objectidentifier, in a different one of said container means than ones of saidcontainer means which already store an object pointer for said specifiedobject.
 12. The method set forth in claim 10,said computer systemincluding a multiplicity of container means, stored in said memorymeans, for referencing sets of said objects, each container meansincluding means for storing a multiplicity of object pointers tolocations in said memory means where said set of objects are stored;each said object pointer in said multiplicity of object container meanscorresponding to one of said object identifiers; said creating stepincluding the step of storing an additional object pointer,corresponding to said additional object identifier, for said specifiedobject in a specified one of said container means only when saidspecified container means does not already store an object pointer tosaid specified object.
 13. The method set forth in claim 12,saidoperating system including a multiplicity of execution threads, eachexecution thread having associated therewith a subset of said containermeans; said method including the step of preserving a specified objectfor a specified one of said execution threads by performing saidcreating step to create an additional object identifier for saidspecified object and storing a corresponding object pointer in one ofsaid container means associated with said specified execution thread;wherein said specified object be deleted until said additional objectidentifier created by said preserving step is deleted.